<?php
/**
 * Класс вида.
 * @author Vadim Belyaev <vadimbelyaev@gmail.com>
 */
class View
{
    /**
     * @var string Полный путь к файлу шаблона
     */
    protected $_template;

    /**
     * @var array Переменные шаблона
     */
    protected $_template_vars = array();

    /**
     * CSS-файлы
     * @see View::addCSS()
     * @see View::getCSSLinks()
     */
    protected $_css_files = array();

    /** JS-файлы
     * @see View::addJSFile()
     * @see View::getJSLinks()
     */
    protected $_js_files = array();

    /**
     * Конструктор класса
     * @param $template Имя файла шаблона
     */
    public function __construct($template = null)
    {
        if ($template !== null) {
            $this->setTemplate($template);
        }
    }

    /**
     * Задает файл шаблона для данного вида.
     * Файл шаблона должен находиться в директории /templates/
     * Именно он будет выведен при вызове метода render()
     * @param $template Имя файла шаблона
     */
    public function setTemplate($template)
    {
        $this->_template = $this->getTemplatePath($template);
    }

    /**
     * Магический метод - сохраняем переменную шаблона
     */
    public function __set($name, $value)
    {
        $this->_template_vars[$name] = $value;
    }

    /**
     * Магический метод - возвращаем переменную шаблона
     */
    public function __get($name)
    {
        if (array_key_exists($name, $this->_template_vars)) {
            return $this->_template_vars[$name];
        } else {
            return null;
        }
    }

    /**
     * Внедрение шаблона в шаблон
     * @param $template string Имя файла шаблона
     */
    public function incl($template)
    {
        include $this->getTemplatePath($template);
    }

    /**
     * Рендерит шаблон и выводит его.
     */
    public function render()
    {
        include $this->_template;
    }

    public function redirect($url)
    {
        header("Location: $url");
    }

    /**
     * Добавляет CSS-файл в список.
     * @see View::getCSSLinks()
     * @param $css_file string Имя CSS-файла
     */
    public function addCSS($css_file)
    {
        if (array_search($css_file, $this->_css_files) === false) {
            $this->_css_files[] = $css_file;
        }
    }
    
    /**
     * Добавляет JS-файл в список.
     * @see View::getJSLinks()
     * @param $js_file string Имя JS-файла
     */
    public function addJS($js_file)
    {
        if (array_search($js_file, $this->_js_files) === false) {
            $this->_js_files[] = $js_file;
        }
    }

    /**
     * Формирует список тегов <link>, подключающих CSS-файлы.
     * @return string
     */
    public function getCSSLinks()
    {
        $result = '';
        foreach ($this->_css_files as $file) {
            $result .= sprintf('<link rel="stylesheet" type="text/css" href="css/%s" />', $file);
        }
        return $result;
    }
    
    /**
     * Формирует список тегов <script>, подключающих JS-файлы.
     * @return string
     */
    public function getJSLinks()
    {
        $result = '';
        foreach ($this->_js_files as $file) {
            $result .= sprintf('<script type="text/javascript" src="js/%s"></script>', $file);
        }
        return $result;
    }

    /**
     * Возвращает полный путь к файлу шаблона.
     * Заодно проверяет существование этого файла.
     * Если файл шаблона не найден - генерирует исключение
     * @param $template string Имя файла шаблона
     * @return string
     * @throws Exception
     */
    protected function getTemplatePath($template)
    {
        $path = APPLICATION_ROOT . 'templates' . DIRECTORY_SEPARATOR . $template;
        if (file_exists($path)) {
            return $path;
        } else {
            throw new Exception("Template $template was not found");
        }
    }
}
